(function(windows) {
    /* 
        promise构造函数
        excutor：执行器函数
    */
    function Promise(excutor) {
        const slef = this
        slef.status = 'pending' //给promise对象指定status属性，初始值为pending
        slef.data = undefined //给promise对象指定一个用于存储结果的属性
        slef.callbacks = [] //给没个元素的结构：{onResolved(){},pnRejected(){}}
        function resolve(value) {
            //如果当前状态不是padding，直接结束
            if (slef.status !== 'pending') {
                return
            }
            //状态改为resolved
            slef.status = 'resolved'
            //保存value数据
            slef.data = value
            //callbacks函数
            if (slef.callbacks.length > 0) {
                setTimeout(() => {
                    slef.callbacks.forEach(calbacksObj => {
                        calbacksObj.onResolved(value)
                    })
                });
            }
        }

        function reject(reason) {
            //如果当前状态不是padding，直接结束
            if (slef.status !== 'pending') {
                return
            }
            //状态改为resolved
            slef.status = 'rejected'
            //保存value数据
            slef.data = reason
            //callbacks函数
            if (slef.callbacks.length > 0) {
                setTimeout(() => {
                    slef.callbacks.forEach(calbacksObj => {
                        calbacksObj.onRejected(reason)
                    })
                })
            }
        }

        try {
            excutor(resolve, reason)
        } catch (error) {
            reject(error)
        }
    }

    //promise原型方法then（）
    // 指定成功的回调，返回promise
    Promise.prototype.then = function(onResolved, onRejected) {
        const slef = this
        slef.callbacks.push({
            onResolved,
            onRejected
        })
    }
    //promise原型方法catch（）
    // 指定失败的回调，返回promise
    Promise.prototype.catch = function(onResolved, onRejected) {

    }
    //promis函数对象resolve（）
    // 返回成功promise
    Promise.resolve = function(value) {

    }
    //promis函数对象reject（）
    // 返回失败promise
    Promise.reject = function(reason) {

    }
    //promis函数对象reject（）
    Promise.all = function(promises) {

    }
    //promis函数对象reject（）
    Promise.race = function(promises) {

    }

    // 向外暴露Promise函数
    window.Promise = Promise
})(window)
